//队列 循环链表表示队列

//假设以带头结点的循环链表表示队列，并且只设一个指针指向队尾元素结点（注意不设头指针），请完成下列任务：


//1: 队列初始化，成功返回真，否则返回假： bool init_queue(LinkQueue *LQ);

//2: 入队列，成功返回真，否则返回假： bool enter_queue(LinkQueue *LQ, ElemType x);

//3: 出队列，成功返回真，且*x为出队的值，否则返回假 bool leave_queue(LinkQueue *LQ, ElemType *x);

//相关定义如下：

//typedef struct _QueueNode {
//    ElemType data;          // 数据域
//    struct _QueueNode *next;      // 指针域
//}LinkQueueNode, *LinkQueue;

#include <stdio.h>
#include <stdlib.h>
#include "list.h" // 请不要删除，否则检查不通过

bool init_queue(LinkQueue *LQ)
{
	*LQ = (LinkQueue)malloc(sizeof(LinkQueueNode));
	if(*LQ == NULL)
	{
	    return false;
	}
	(*LQ)->data = 0;
	(*LQ)->next = *LQ;
	return true;
}

bool enter_queue(LinkQueue *LQ, ElemType x)
{
	LinkQueueNode* newnode = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
	if(newnode == NULL)
	{
	    return false;
	}
	newnode->next = (*LQ)->next;
	newnode->data = x;
	(*LQ)->next = newnode;
	
	*LQ = newnode;
	return true;
}

bool leave_queue(LinkQueue *LQ, ElemType *x)
{
    if((*LQ)->next == *LQ || (*LQ)->next == NULL)
    return false;
    
    LinkQueueNode* head = (*LQ)->next;
	LinkQueueNode* del = head->next;
	*x = del->data;
	
	head->next = head->next->next;
	free(del);
	if(head->next == head)
	*LQ = head;
	
	return true;
}